#!/usr/bin/env python3
"""
集成 pytest-benchmark 和资源监控的命令行工具
"""
import argparse
import subprocess
import sys
from pathlib import Path


def run_benchmark_tests(mode="moderate", test_pattern="", max_time=None, save_results=False, compare_with=None, verbose=False):
    """运行集成的基准测试"""
    
    # 基础命令
    cmd = ["pytest", "test_benchmark_integrated.py"]
    
    # 测试模式选择
    if test_pattern:
        cmd.extend(["-k", test_pattern])
    elif mode:
        cmd.extend(["-k", mode])
    
    # 时间限制 (pytest-benchmark 参数)
    time_limits = {
        "conservative": 10,
        "moderate": 30, 
        "aggressive": 60
    }
    
    if max_time is None:
        max_time = time_limits.get(mode, 30)
    
    cmd.extend([
        f"--benchmark-max-time={max_time}",
        "--benchmark-min-rounds=2",
        "--benchmark-disable-gc",
        "--benchmark-warmup=on"
    ])
    
    # 结果保存 (pytest-benchmark 参数)
    if save_results:
        cmd.extend([f"--benchmark-save={mode}_{save_results}"])
    
    # 结果对比 (pytest-benchmark 参数)
    if compare_with:
        cmd.extend([f"--benchmark-compare={compare_with}"])
    
    # 详细输出
    if verbose:
        cmd.extend(["-v", "-s", "--benchmark-verbose"])
    else:
        cmd.extend(["-v"])
    
    # 执行命令
    print(f"🚀 运行命令: {' '.join(cmd)}")
    print("=" * 80)
    
    try:
        result = subprocess.run(cmd, check=False)
        return result.returncode
    except KeyboardInterrupt:
        print("\n❌ 用户中断测试")
        return 1
    except Exception as e:
        print(f"❌ 执行失败: {e}")
        return 1


def main():
    parser = argparse.ArgumentParser(
        description="集成 pytest-benchmark 和资源监控的基准测试工具",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  %(prog)s                           # 运行适中模式测试
  %(prog)s conservative              # 运行保守模式测试 (≤6字符)
  %(prog)s moderate                  # 运行适中模式测试 (≤8字符)
  %(prog)s aggressive                # 运行激进模式测试 (≤10字符)
  %(prog)s -p "2chars"               # 只测试2字符算法
  %(prog)s -p "recursive"            # 只测试递归算法
  %(prog)s --save baseline           # 保存结果为基线
  %(prog)s --compare baseline        # 与基线对比
  %(prog)s --time 60 --verbose       # 60秒限制，详细输出

资源限制说明:
  conservative: 100MB内存, 10秒时间, ≤6字符, 适合开发调试
  moderate:     500MB内存, 30秒时间, ≤8字符, 适合CI测试
  aggressive:   1GB内存,   60秒时间, ≤10字符, 适合性能调优
        """
    )
    
    parser.add_argument(
        "mode", 
        nargs="?", 
        choices=["conservative", "moderate", "aggressive"],
        default="moderate",
        help="资源限制模式 (默认: moderate)"
    )
    
    parser.add_argument(
        "-p", "--pattern",
        help="测试模式过滤 (例如: '2chars', 'recursive', 'iterative')"
    )
    
    parser.add_argument(
        "-t", "--time",
        type=int,
        help="最大执行时间 (秒)"
    )
    
    parser.add_argument(
        "-s", "--save",
        metavar="NAME",
        help="保存基准测试结果"
    )
    
    parser.add_argument(
        "-c", "--compare",
        metavar="NAME", 
        help="与历史结果对比"
    )
    
    parser.add_argument(
        "-v", "--verbose",
        action="store_true",
        help="详细输出"
    )
    
    parser.add_argument(
        "--list-saved",
        action="store_true",
        help="列出已保存的基准测试结果"
    )
    
    args = parser.parse_args()
    
    # 列出已保存的结果
    if args.list_saved:
        benchmarks_dir = Path(".benchmarks")
        if benchmarks_dir.exists():
            print("📊 已保存的基准测试结果:")
            for result_dir in benchmarks_dir.iterdir():
                if result_dir.is_dir():
                    print(f"  - {result_dir.name}")
        else:
            print("📊 暂无保存的基准测试结果")
        return 0
    
    # 显示配置信息
    print("🔧 集成基准测试配置:")
    print(f"   资源模式: {args.mode}")
    print(f"   时间限制: {args.time or '自动'} 秒")
    print(f"   测试过滤: {args.pattern or '全部'}")
    if args.save:
        print(f"   保存结果: {args.save}")
    if args.compare:
        print(f"   对比基线: {args.compare}")
    print()
    
    # 运行测试
    return run_benchmark_tests(
        mode=args.mode,
        test_pattern=args.pattern,
        max_time=args.time,
        save_results=args.save,
        compare_with=args.compare,
        verbose=args.verbose
    )


if __name__ == "__main__":
    sys.exit(main())
